﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using ProjetoJornada_DAL;
using Basicas;
using Basicas.Utils;
using System.Data;

namespace ProjetoJornada_DAL.Repositorio
{
    public class RepAluno
    {
        private DAO dao;

        public RepAluno()
        {
            this.dao = DAO.Instance;
        }

        #region Metodos
        private Aluno CarregarAluno(MySqlDataReader dr)
        {            
            
            String cpf = dr.GetString("CPF");
            String nome = dr.GetString("Nome");
            String email = dr.GetString("Email");
            String telefone = dr.GetString("Telefone");
            String celular = dr.GetString("Celular");
            String cidade = dr.GetString("Cidade");
            String bairro = dr.GetString("Bairro");
            String rua = dr.GetString("Rua");
            Int32 numero = dr.GetInt32("Numero");
            String complemento = dr.GetString("Complemento");
            String UF = dr.GetString("UF");
            String RG = dr.GetString("RG");
            String instituicao = dr.GetString("InstituicaoDeEnsino");
            String sexo = dr.GetString("Sexo");
            DateTime dataNasc = dr.GetDateTime("DataNasc");

            return new Aluno(cpf, RG, nome, email, telefone, celular, cidade, bairro, rua, numero,
                complemento, UF, instituicao, sexo, dataNasc);

        }
        
        public Boolean InserirAluno(Aluno aluno)
        {
            String storeProcedure1 = "sp_Aluno_Inserir";
            String storeProcedure2= "sp_PessoaEndereco_Select_Cpf";
            String storeProcedure3 = "sp_PessoaEndereco_Inserir";
            String storeProcedure4 = "sp_PessoaEndereco_Edit";
            MySqlDataReader dr = null;

            try
            {
                MySqlParameter[] parametros = new MySqlParameter[12];

                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"cpfIn";
                parametros[0].Value = aluno.Cpf;
                parametros[0].DbType = System.Data.DbType.String;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"nomeIn";
                parametros[1].Value = aluno.Nome;
                parametros[1].DbType = System.Data.DbType.String;

                parametros[2] = new MySqlParameter();
                parametros[2].ParameterName = @"emailIn";
                parametros[2].Value = aluno.Email;
                parametros[2].DbType = System.Data.DbType.String;

                parametros[3] = new MySqlParameter();
                parametros[3].ParameterName = @"telefoneIn";
                parametros[3].Value = aluno.Telefone;
                parametros[3].DbType = System.Data.DbType.String;

                parametros[4] = new MySqlParameter();
                parametros[4].ParameterName = @"celularIn";
                parametros[4].Value = aluno.Celular;
                parametros[4].DbType = System.Data.DbType.String;

                parametros[5] = new MySqlParameter();
                parametros[5].ParameterName = @"cidadeIn";
                parametros[5].Value = aluno.Cidade;
                parametros[5].DbType = System.Data.DbType.String;

                parametros[6] = new MySqlParameter();
                parametros[6].ParameterName = @"bairroIn";
                parametros[6].Value = aluno.Bairro;
                parametros[6].DbType = System.Data.DbType.String;

                parametros[7] = new MySqlParameter();
                parametros[7].ParameterName = @"ruaIn";
                parametros[7].Value = aluno.Rua;
                parametros[7].DbType = System.Data.DbType.String;

                parametros[8] = new MySqlParameter();
                parametros[8].ParameterName = @"numeroIn";
                parametros[8].Value = aluno.Numero;
                parametros[8].DbType = System.Data.DbType.Int32;

                parametros[9] = new MySqlParameter();
                parametros[9].ParameterName = @"complementoIn";
                parametros[9].Value = aluno.Complemento;
                parametros[9].DbType = System.Data.DbType.String;

                parametros[10] = new MySqlParameter();
                parametros[10].ParameterName = @"ufIn";
                parametros[10].Value = aluno.Uf;
                parametros[10].DbType = System.Data.DbType.String;

                parametros[11] = new MySqlParameter();
                parametros[11].ParameterName = @"rgIn";
                parametros[11].Value = aluno.Rg;
                parametros[11].DbType = System.Data.DbType.String;

                //Parametros da tabela Aluno
                MySqlParameter[] parametros2 = new MySqlParameter[4];

                parametros2[0] = new MySqlParameter();
                parametros2[0].ParameterName = @"cpfIn";
                parametros2[0].Value = aluno.Cpf;
                parametros2[0].DbType = System.Data.DbType.String;

                parametros2[1] = new MySqlParameter();
                parametros2[1].ParameterName = @"instensinoIn";
                parametros2[1].Value = aluno.InstituicaoEnsino;
                parametros2[1].DbType = System.Data.DbType.String;

                parametros2[2] = new MySqlParameter();
                parametros2[2].ParameterName = @"sexoIn";
                parametros2[2].Value = aluno.Sexo;
                parametros2[2].DbType = System.Data.DbType.String;

                parametros2[3] = new MySqlParameter();
                parametros2[3].ParameterName = @"datanascimentoIn";
                parametros2[3].Value = aluno.DataNascimento;
                parametros2[3].DbType = System.Data.DbType.Date;

                MySqlParameter[] parametros3 = new MySqlParameter[1];
                parametros3[0] = new MySqlParameter();
                parametros3[0].ParameterName = @"cpfIn";
                parametros3[0].Value = aluno.Cpf;
                parametros3[0].DbType = System.Data.DbType.String;

                dr = dao.ExecutaLeituraProcedure(parametros3, storeProcedure2);

                if (dr.Read())
                {
                    dao.FecharConexao();
                    dao.ExecutaSql(parametros2, storeProcedure1);
                    dao.FecharConexao();
                    return dao.ExecutaSql(parametros, storeProcedure4);
                }
                else
                {
                    dao.FecharConexao();
                    dao.ExecutaSql(parametros, storeProcedure3);
                    dao.FecharConexao();
                    return dao.ExecutaSql(parametros2, storeProcedure1);                                        
                }
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "inserirAluno");
                throw ex;
            }
            finally
            {
                if (dao != null)
                {
                    dao.FecharConexao();
                }
                if (dr != null)
                {
                    dr.Close();
                }
            }
        }
        
        public Boolean RemoverAluno(String cpf)
        {
            String storeProcedure = "sp_Aluno_Delete";
            MySqlParameter[] parametros = new MySqlParameter[1];

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"cpfAluno";
                parametros[0].Value = cpf;
                parametros[0].DbType = System.Data.DbType.String;

                return dao.ExecutaSql(parametros, storeProcedure);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "deleteAluno");
                throw ex;
            }
            finally
            {
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
        }
        
        public Boolean EditarAluno(Aluno aluno)
        {
            MySqlParameter[] parametros = new MySqlParameter[15];
            String storeProcedure = "sp_Aluno_Edit";

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"cpfAluno";
                parametros[0].Value = aluno.Cpf;
                parametros[0].DbType = System.Data.DbType.String;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"rgAluno";
                parametros[1].Value = aluno.Rg;
                parametros[1].DbType = System.Data.DbType.String;

                parametros[2] = new MySqlParameter();
                parametros[2].ParameterName = @"instituicao";
                parametros[2].Value = aluno.InstituicaoEnsino;
                parametros[2].DbType = System.Data.DbType.String;

                parametros[3] = new MySqlParameter();
                parametros[3].ParameterName = @"sexoDigitado";
                parametros[3].Value = aluno.Sexo;
                parametros[3].DbType = System.Data.DbType.String;

                parametros[4] = new MySqlParameter();
                parametros[4].ParameterName = @"nascimento";
                parametros[4].Value = aluno.DataNascimento;
                parametros[4].DbType = System.Data.DbType.Date;

                parametros[5] = new MySqlParameter();
                parametros[5].ParameterName = @"nomeAluno";
                parametros[5].Value = aluno.Nome;
                parametros[5].DbType = System.Data.DbType.String;

                parametros[6] = new MySqlParameter();
                parametros[6].ParameterName = @"emailAluno";
                parametros[6].Value = aluno.Email;
                parametros[6].DbType = System.Data.DbType.String;

                parametros[7] = new MySqlParameter();
                parametros[7].ParameterName = @"telefoneAluno";
                parametros[7].Value = aluno.Telefone;
                parametros[7].DbType = System.Data.DbType.String;

                parametros[8] = new MySqlParameter();
                parametros[8].ParameterName = @"celularAluno";
                parametros[8].Value = aluno.Celular;
                parametros[8].DbType = System.Data.DbType.String;

                parametros[9] = new MySqlParameter();
                parametros[9].ParameterName = @"cidadeAluno";
                parametros[9].Value = aluno.Cidade;
                parametros[9].DbType = System.Data.DbType.String;

                parametros[10] = new MySqlParameter();
                parametros[10].ParameterName = @"bairroAluno";
                parametros[10].Value = aluno.Bairro;
                parametros[10].DbType = System.Data.DbType.String;

                parametros[11] = new MySqlParameter();
                parametros[11].ParameterName = @"ruaAluno";
                parametros[11].Value = aluno.Rua;
                parametros[11].DbType = System.Data.DbType.String;

                parametros[12] = new MySqlParameter();
                parametros[12].ParameterName = @"numeroAluno";
                parametros[12].Value = aluno.Numero;
                parametros[12].DbType = System.Data.DbType.Int32;

                parametros[13] = new MySqlParameter();
                parametros[13].ParameterName = @"complementoAluno";
                parametros[13].Value = aluno.Complemento;
                parametros[13].DbType = System.Data.DbType.String;

                parametros[14] = new MySqlParameter();
                parametros[14].ParameterName = @"ufAluno";
                parametros[14].Value = aluno.Uf;
                parametros[14].DbType = System.Data.DbType.String;

                return dao.ExecutaSql(parametros, storeProcedure);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "removerAluno");
                throw ex;
            }
            finally
            {
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
        }
        
        public Aluno ConsultarAlunoPorCpf(String cpf)
        {
            MySqlParameter[] parametro = new MySqlParameter[1];
            String storeProcedure = "sp_Aluno_Select_Cpf";
            MySqlDataReader dr = null;
            Aluno aluno = null;

            try
            {
                parametro[0] = new MySqlParameter();
                parametro[0].ParameterName = "@cpfIn";
                parametro[0].Value = cpf;
                parametro[0].DbType = System.Data.DbType.String;

                dr = dao.ExecutaLeituraProcedure(parametro, storeProcedure);

                if (dr.Read())
                {
                    aluno = this.CarregarAluno(dr);
                }
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "consultarAlunoCpf");
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }

            return aluno;
        }

        public List<Aluno> ConsultarTodosAlunos()
        {
            String store_procedure = "sp_Aluno_Select_All";
            List<Aluno> alunos = new List<Aluno>();
            MySqlDataReader dr = null;

            try
            {
                dr = dao.ExecutaLeituraProcedure(store_procedure);

                while (dr.Read())
                {
                    alunos.Add(this.CarregarAluno(dr));
                }
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "consultarTodosAlunos");
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return alunos;
        }

        public List<Aluno> ConsultarAlunoPorNome(String nome)
        {
            String storeProcedure = "sp_Aluno_Select_Nome";
            List<Aluno> alunos = new List<Aluno>();
            MySqlDataReader dr = null;
            MySqlParameter[] parametros = new MySqlParameter[1];

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = "@nomeIn";
                parametros[0].Value = nome;
                parametros[0].DbType = System.Data.DbType.String;

                dr = dao.ExecutaLeituraProcedure(parametros, storeProcedure);

                while (dr.Read())
                {
                    alunos.Add(this.CarregarAluno(dr));
                }
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "consultarAlunosPorNome");
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return alunos;
        }

        #endregion
        }
}
